// bsf 二分查找树 由于 不是完全二叉树 不能用数组存储 只能用指针或者引用
#ifndef DATASTRUCT_BSF_H
#define DATASTRUCT_BSF_H

typedef struct Node{
    int key;
    int value;
    struct Node  *lChild, *rChild;
}Node;

#define MAXSIZE 100

//根节点
static Node* root;
//二分查找数的数量
static int count;

/**
 *
 * @return 二分查找树的个数
 */
int getBsfLength();

/**
 *
 * @return 二分查找树是不是空
 */
int isBsfEmpty();

/**
 *
 * @param key 插入的键
 * @param value 插入的值
 */
void insertBSF(int key,int value);

/**
 *
 * @param node 插入的节点
 * @param key 插入的键
 * @param value 插入的值
 * @return
 */
static Node* __insertBSF(Node* node,int key, int value);

/**
 *
 * @param key 查找的键
 * @return 如果有该键 则返回值 如果没有返回-1
 */
int searchBSF(int key);

/**
 * @param node 查找的节点
 * @param key 查找的键
 * @return 如果有该键 则返回值 如果没有返回-1
 */
static int __searchBSF(Node* node,int key);

/**
 * 销毁BSF树
 */
void destroyBSF();
/**
 * 先序遍历二叉查找树
 */
void travelBSF();

/**
 *
 * @param node 遍历的节点
 */
static void __travelBSF(Node* node);


static void __travelBSF1(Node* node);

/**
 *
 * @param node 销毁的节点
 */
static void __destroyBSF(Node** node);

/**
 * 删除键 等于 key的节点
 * @param key 查找的键
 * @return 如果有该键 则返回值 如果没有返回-1
 */
int deleteBSF(int key);

/**
 *
 * @param node 查找的节点
 * @param key 查找的键
 * @return 如果有该键 则返回值 如果没有返回-1
 */
static int __deleteBSF(Node** node,int key);


#endif
